package br.ufal.ic.fracao.especialist.editor;

public class Lexema {
    
	Token token = new Token();
    String s = new String();
    int i = 0;
    
    public Lexema(final String _s) {
        s = _s;
    }
    
    private char proxCaracter() {
        char c = ' ';
        if(i<s.length()){
            c = s.charAt(i);
        }
        i++;
        return c;
    }
    
    
    public void comeBack(){
        i = i - 1;
    }
    
    public void analiseLexica() {
        int estado = 0;
        char c = proxCaracter();
        while (true) {
            switch (estado) {
                case 0:
                    switch (c) {
                        case 'r':
                            estado = 1;
                            break;
                        case '=':
                            estado = 10;
                            break;
                        case '(':
                            estado = 12;
                            break;
                            
                        case ')':
                            estado = 13;
                            break;
                        case ';':
                            estado = 14;
                            break;
                        case '-':
                            estado = 2;
                            break;
                        case '&':
                            estado = 3;
                            break;
                        default:
                            estado = 30;
                            break;
                    }
                    break;
                case 1:
                    c = proxCaracter();
                    if (c == 'u') {
                        c = proxCaracter();
                        if (c == 'l') {
                            c = proxCaracter();
                            if (c == 'e') {
                                c = proxCaracter();
                                if(c == ' ' || c == '\n' || c == '\r' || c == '('){
                                    estado = 11;
                                    comeBack();
                                    break;
                                }
                            }
                        }
                    }
                    estado = 30;
                    break;
                case 2:
                    c  = proxCaracter();
                    if(c == '>'){
                        estado = 15;
                        break;
                    }
                    estado = 30;
                    break;
                case 3:
                    c = proxCaracter();
                    if(c == '&'){
                        estado = 16;
                        break;
                    }
                    estado = 30;
                    break;
                case 10:
                    token.proxToken = token.operator_equal;
                    return;
                case 11:
                    token.proxToken = token.palavra_reservada_rule;
                    return;
                    
                case 12:
                    token.proxToken = token.parenteses_esquerdo;
                    return;
                case 13:
                    token.proxToken = token.parenteses_direito;
                    return;
                case 14:
                    token.proxToken = token.codigo_final;
                    return;
                case 15:
                    token.proxToken = token.sinal_consequence;
                    return;
                case 16:
                    token.proxToken = token.operator_and;
                    return;
                    
                case 30:
                    if(i >= s.length()){
                        return;
                    }
                    estado = 0;
                    c = proxCaracter();
                    break;
            }
        }
    }
    
    public int getI() {
        return i;
    }
    
    public void setI(int i) {
        this.i = i;
    }
        
}
